[TOC]
0. 房间级监听事件
0.1 登录监听
登录监听主要是对初始化sdk的参数进行验,并与服务端建立连接 事件监听,建议在初始化sdk后做监听
0.1.1 登录成功事件
rtc.on('login_success', function (data) {
// 登录成功
console.log(data,'login_success');
});
返回 data 部分数据格式如下
{
result:"OK",
data:{
"desc": "9DC1A878A164F696", //房间描述
"talker_bitrate": 200, //学生推流码率
"publisher_bitrate": 200, //老师推流码率
"live": {
"id": 1231, // 直播id
"status": 0, // 1为开始
"last": "2000" // 如果status为1,则last为直播持续时长,单位毫秒
"startTime":"1503908480000" //直播开始时间戳
}
"max_streams": 6, //允许最大视频流数
"name": "testName", //用户昵称
"result": "OK",
"user": {
"id": "6e373a456cd04b45b00f7b97986a45fc", //用户唯一id
"name": "testName", //用户name
"viewerid": "815Q94vnhddDu7NO", //用户在当前直播间的唯一ID
"role": "talker", //'talker'学生 'presenter'老师
"roomid": "EC05E15A770D84AC9C33DC5901307461", // 房间id
},
"video_mode": 1, // 视频模式1为音视频模式 , 2为仅音频模式
"is_follow": '', // 默认为空,如果是跟随模式,则为流id
"max_users": 1, // 最大支持连麦人数
"allow_chat": true // 是否允许发言,默认为True, 房间级配置
"allow_audio": true // 是否允许麦克风 默认为True, 房间级配置
"allow_speak": true // 是否允许上麦,默认为True 房间级配置
"rtspurl": "" //第三方推流地址
}
}
0.1.2 登录失败事件
初始化sdk验证失败
rtc.on('login_failed', function (err) {
// 登录失败
console.error('登录失败',err);
});
错误码 | 错误描述 |
---|---|
1100 | 房间配额超限制 |
2001 | 房间不存在 |
2002 | 房间已过期 |
2003 | 房间人数已满,请联系老师处理 |
3003 | 用户不存在 |
3006 | 老师已登录 |
3007 | 用户已登录 |
5100 | 调用调度系统失败 |
0.2 加入房间事件
加入流房间是准备视频流环境,满足用户推拉流需要
0.2.1 加入房间成功事件
加入房间成功,标志着视频流服务已准备完成,此时可以创建本地流。
rtc.on('conference_join', function () {
// 有监听就是加入房间成功
});
0.2.2 加入房间失败事件
加入房间失败,视频流服务准备出错
rtc.on('conference_join_failed', function (err) {
// 加入房间失败 err为错误原因
console.log('加入房间失败',err);
});
0.2.3 用户配置事件
单个用户配置监听
rtc.on('switch_user_settings', function (settingData) {
{
"changed": "settings对象中的某个Key / reset", // 用户想要改变哪一项的权限;如果收到reset,则重置settings里所有的权限状态。
"settings": { // 用户可改变的权限及状态 true:打开 false:关闭
"allow_chat": "true", // 聊天
"allow_video": "true", // 视频
"allow_audio": "true", // 音频
"allow_draw": "false", // 画笔
"allow_assistant": "false" // 授权讲师
},
"userId": "CILMJa5uh6AoZBa6" // 用户在当前直播间的唯一ID
}
});
0.2.4 房间全量信息事件(人员进出时广播)
rtc.on('room_context', function (roomData) {
{
"roomId": "B63D9CFC3C8CE99B9C33DC5901307461",
"onlineUsers": [
{
"id": "rJfe0ZyTizheAwss",
"name": "andy",
"role": "presenter",
"ip": "103.90.191.98",
"streamId": "",
"platform": "5",
"status": "0",
"requestTime": "",
"publishTime": "",
"socketId": "/B63D9CFC3C8CE99B9C33DC5901307461#e5NwdhBUOJ_MaD7MAAvg",
"lock": "false",
"joinTime": "2020-12-02 15.37.45",
"custom": "0",
"uid": "2002472038"
},
{
"id": "rdcr_ckEhgZ2iMX1",
"name": "石头",
"role": "talker",
"ip": "103.90.191.98",
"streamId": "",
"platform": "5",
"status": "0",
"requestTime": "",
"publishTime": "",
"socketId": "/B63D9CFC3C8CE99B9C33DC5901307461#6Zu8k30M9tLIO1EmAAIP",
"lock": "false",
"joinTime": "2020-12-02 15.38.39",
"custom": "0",
"uid": "1010956810"
}],
"userCount": 2,
"userSettings": {
"rJfe0ZyTizheAwss": {
"allow_chat": "true",
"allow_video": "true",
"allow_audio": "true",
"allow_draw": "false",
"hand_up": "false",
"allow_assistant": "false",
"allow_trigger": "false"
},
"rdcr_ckEhgZ2iMX1": {
"allow_chat": "true",
"allow_video": "true",
"allow_audio": "true",
"allow_draw": "false",
"hand_up": "false",
"allow_assistant": "false",
"allow_trigger": "false"
}
},
"roomSettings": {
"source_type": "0",
"lock_screen": "false",
"allow_speak_interaction": "false",
"layout_video_main": "false",
"allow_chat": "true",
"delay_time": "3",
"allow_question": "true",
"open_host_mode": "false",
"room_base_user_count": "0"
},
"time": 1606894719000,
"usersSeq": 167,
"settingSeq": 152
}
})
0.2.5 人员列表事件(人员麦序变化时广播)
rtc.on('speak_context', function (speakData) {
{
"action": "speak_context",
"time": 1606894855063,
"usersSeq": 176,
"user_update": {
"action": "user_update",
"type": "speak",
"data": {
"userid": "rdcr_ckEhgZ2iMX1",
"status": "3",
"username": "石头",
"custom": "0",
"uid": "1010956810"
}
},
"onlineUsers": [
{
"id": "rJfe0ZyTizheAwss",
"platform": "5",
"name": "andy",
"avatar": "",
"joinTime": "2020-12-02 15.37.45",
"requestTime": "",
"status": "3",
"socketId": "/B63D9CFC3C8CE99B9C33DC5901307461#e5NwdhBUOJ_MaD7MAAvg",
"publishTime": "1606894840655",
"lock": "false",
"ip": "103.90.191.98",
"uid": "2002472038",
"role": "presenter",
"streamId": "2002472038"
},
{
"id": "rdcr_ckEhgZ2iMX1",
"platform": "5",
"name": "石头",
"avatar": "",
"joinTime": "2020-12-02 15.38.39",
"requestTime": "1606894852510",
"status": "3",
"socketId": "/B63D9CFC3C8CE99B9C33DC5901307461#6Zu8k30M9tLIO1EmAAIP",
"publishTime": "1606894855042",
"lock": "false",
"ip": "103.90.191.98",
"uid": "1010956810",
"role": "talker",
"streamId": "1010956810"
}]
}
})
0.3 房间设置事件
rtc.on('switch_settings', function () {
{
"action": "switch_settings",
"settings": {
"allow_audio": false // true: 打开 false: 关闭
},
"changed": [
"allow_audio" // changed 类型见下表
]
}
})
类型 | 说明 |
---|---|
allow_speak | 全体上/下麦 |
allow_audio | 全体静音 |
allow_chat | 全体禁言 |
1. 流相关方法
1.1 本地流相关方法
1.1.1 创建本地流(包括辅助摄像头)
必须在加入房间成功的“conference_join”事件(0.2.1)回调里创建本地流
rtc.createLocalStream(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
streamName | String | 创建本地流名称 | 必选 |
showVoice | function | 音量值回调 | 可选 |
createData | object | 创建本地流自定义参数 | 可选 |
success | function | 创建本地流成功回调(含参数) | 必选 |
fail | function | 创建本地流失败回调(含参数) | 可选 |
object:为创建本地流参数对象,包含以下属性
* (必选)streamName 创建本地流名称,数据类型(String),可选参数值为 'main'、'picture'
此参数为区分多条本地流操作,如果本地只创建一条流,就使用'main'
此参数为区分多条本地流操作,如果要使用辅助摄像头,就使用'picture'
* (可选)showVoice 音量值回调
object.showVoice = function(value){
// value值范围(0-100)
}
* (可选) createData 选用特定音视频设备创建本地流,数据类型(object),不选该参数,系统自动识别设备
object.createData = {
video:{
device: 'camera', // 固定配置,使用摄像头
resolution: 'vga', // 见下表格
deviceId: 'xxxxxxxxxx'
}, // 如果video:false ,则表示不开启视频
audio: {
deviceId: 'xxxxxxxxxx'
} // 是否创建音频,可直接传入对象,参数为设备ID,也可以直接传入布尔值true/false 表示是否创建音频
}
* (必选)success 成功回调
object.success = function(stream){
// 返回值为创建的本地流对象
stream.show(id); // 将本地流显示在元素id值为id的盒子中
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
// 如果没有传入resolution,默认也是此表格数值
resolution | 分辨率 | 帧率 | 码率 |
---|---|---|---|
sif | 240*320 | 15 | 250 |
vga | 480*640 | 15 | 500 |
720P | 720*1280 | 15 | 800 |
1080P | 1080*1920 | 30 | 2000 |
使用例子:
rtc.createLocalStream({
streamName: 'main',
showVoice: function(value){
// value值范围(0-100)
},
success: function(stream){
stream.show('id'); // 将本地流显示在元素id值为id的盒子中
},
fail: function(str){
console.log(str);
}
});
1.1.2 关闭本地流声音
rtc.pauseAudio(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
streamName | String | 本地流名称 | 必选 |
success | function | 成功回调 | 可选 |
fail | function | 失败回调 | 可选 |
object:为对象,包含以下属性
* (必选)streamName 本地流名称,数据类型(String),可选参数值为 'main'、'picture'
此参数为区分多条本地流操作,如果本地只创建一条流,就使用'main'
* (可选)success 成功回调
object.success = function(){
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.pauseAudio({
streamName: 'main',
success: function(){
},
fail: function(str){
console.log(str);
}
});
1.1.3 开启本地流声音
rtc.playAudio(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
streamName | String | 本地流名称 | 必选 |
success | function | 成功回调 | 可选 |
fail | function | 失败回调 | 可选 |
object:为对象,包含以下属性
* (必选)streamName 本地流名称,数据类型(String),可选参数值为 'main'、'picture'
此参数为区分多条本地流操作,如果本地只创建一条流,就使用'main'
* (可选)success 成功回调
object.success = function(){
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.playAudio({
streamName: 'main',
success: function(){
},
fail: function(str){
console.log(str);
}
});
1.1.4 关闭本地流视频画面
rtc.pauseVideo(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
streamName | String | 本地流名称 | 必选 |
success | function | 成功回调 | 可选 |
fail | function | 失败回调 | 可选 |
object:为对象,包含以下属性
* (必选)streamName 本地流名称,数据类型(String),可选参数值为 'main'、'picture'
此参数为区分多条本地流操作,如果本地只创建一条流,就使用'main'
* (可选)success 成功回调
object.success = function(){
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.pauseVideo({
streamName: 'main',
success: function(){
},
fail: function(str){
console.log(str);
}
});
1.1.5 开启本地流视频画面
rtc.playVideo(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
streamName | String | 本地流名称 | 必选 |
success | function | 成功回调 | 可选 |
fail | function | 失败回调 | 可选 |
object:为对象,包含以下属性
* (必选)streamName 本地流名称,数据类型(String),可选参数值为 'main'、'picture'
此参数为区分多条本地流操作,如果本地只创建一条流,就使用'main'
* (可选)success 成功回调
object.success = function(){
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.playVideo({
streamName: 'main',
success: function(){
},
fail: function(str){
console.log(str);
}
});
1.1.6 结束本地流
rtc.closeVideo(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
streamName | String | 本地流名称 | 必选 |
success | function | 成功回调 | 可选 |
fail | function | 失败回调 | 可选 |
object:为对象,包含以下属性
* (必选)streamName 本地流名称,数据类型(String),可选参数值为 'main'、'picture'
此参数为区分多条本地流操作,如果本地只创建一条流,就使用'main'
此参数为区分多条本地流操作,如果要使用辅助摄像头,就使用'picture'
* (可选)success 成功回调
object.success = function(){
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.closeVideo({
streamName: 'main',
success: function(){
},
fail: function(str){
console.log(str);
}
});
1.1.7 推送本地流
rtc.publish(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
streamName | String | 本地流名称 | 必选 |
mix | boolean | 是否进行合流 | 可选 |
audioRate | Number | 音频推送码率 | 可选 |
videoRate | Number | 视频推送码率 | 可选 |
success | function | 成功回调(含参数) | 可选 |
fail | function | 失败回调(含参数) | 可选 |
object:包含以下属性
* (必选)streamName 本地流名称,数据类型(String),可选参数值为 'main'、'picture'
此参数为区分多条本地流操作,如果本地只创建一条流,就使用'main'
此参数为区分多条本地流操作,如果要使用辅助摄像头,就使用'picture'
* (可选)mix 是否进行合流( true 进行合流,false 不进行合流),默认false 不进行合流
* (可选)audioRate 音频码率(50 - 200)数据类型(Number),默认50
* (可选)videoRate 音频码率(50 - 2000)数据类型(Number),默认200
* (可选)successed 成功回调
object.success = function(stream){
// 返回值为流对象
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.publish({
streamName: 'main',
mix: true,
videoRate: 300,
audioRate: 50,
success: function(stream){
console.log('本地流推送成功', stream.id());
},
fail: function(str){
console.log(str);
}
});
1.1.8 取消推送本地流
rtc.unPublish(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
streamName | String | 本地流名称 | 必选 |
success | function | 成功回调(含参数) | 可选 |
fail | function | 失败回调(含参数) | 可选 |
object 包含以下属性
* (必选)streamName 本地流名称,数据类型(String),可选参数值为 'main'、'picture'
此参数为区分多条本地流操作,如果本地只创建一条流,就使用'main'
此参数为区分多条本地流操作,如果要使用辅助摄像头,就使用'picture'
* (可选)success 成功回调
object.success = function(id){
// 返回值为流对象id
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.unPublish({
streamName: 'main',
success: function(id){
console.log('取消本地流推送成功',id);
},
fail: function(str){
console.log(str);
}
});
1.1.9 推送桌面共享
rtc.publishShareStream(object);
使用说明:1.该功能需要https环境 2.需要使用含有域名的插件
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
mix | boolean | 是否进行合流 | 可选 |
audioRate | Number | 音频推送码率 | 可选 |
videoRate | Number | 视频推送码率 | 可选 |
success | function | 成功回调(含参数) | 可选 |
fail | function | 失败回调(含参数) | 可选 |
object:包含以下属性
* (可选)mix 是否进行合流( true 进行合流,false 不进行合流),默认false 不进行合流
* (可选)audioRate 音频码率(50 - 200)数据类型(Number),默认50
* (可选)videoRate 音频码率(50 - 2000)数据类型(Number),默认200
* (可选)success 成功回调
object.success = function(stream){
// 返回值为流对象
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.publishShareStream({
videoRate: 300,
audioRate: 50,
mix: true,
success: function(stream){
console.log('推送桌面共享成功', stream.id());
},
fail: function(str){
console.log(str);
}
});
1.1.10 关闭桌面共享
rtc.unPubShareStream();
使用说明:此方法用于关闭已开启的桌面共享( 需使用最新桌面共享插件)
关闭桌面共享目前提供两种方法:
- 直接关闭浏览器桌面共享控制条
- 调用关闭桌面api实现关闭
使用例子:
rtc.unPubShareStream();
1.1.11 视频无法自动播放
当有视频不能自动播放时会收到以下回调
rtc.on('playError', function(data){
console.log(data);
});
// data格式如下:
{
videoDom: obj, //视频流对象或者video对象
type: 1 // 标示不同的渲染方式 ,可选值0 / 1
}
处理建议:
1.将收到的回调中videoDom依次加入数组
2.通过dom交互后,遍历数组中每一项,如果type 为 0使用data.videoDom.play()的方法播放每一个video,如果type为 1使用data.videoDom.resume()播放视频
1.1.12 推流成功后流类型
例:订阅到的流类型
rtc.on('allow_sub', function (stream) {
let streamType = stream.streamType()
})
值(streamType) | 类型 |
---|---|
0 | 本地摄像头; |
1 | 桌面共享; |
2 | 视频; |
3 | 音频; |
10 | 本地辅助摄像头; |
1.1.13 浏览器和版本判断
rtc.getBrowser({
success: function(data) {
// data.type: 浏览器
}
})
1.2 远程流方法
1.2.1 订阅远程流
rtc.trySubscribeStream(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
tryStream | object | 要订阅的流对象 | 必选 |
tryData | Number | 选择音视频订阅项(默认音视频都订阅) | 可选 |
showVoice | function | 音量值回调(含参数) | 可选 |
success | function | 成功回调(含参数) | 可选 |
fail | function | 失败回调(含参数) | 可选 |
object:为对象,包含以下属性
* (必选)tryStream 要订阅的流对象
* (可选)tryData 要订阅的流参数
object.tryData = {
video: false, //是否订阅视频 true 、 false
audio: true //是否适用音频 true 、 false
}
* (可选)success 成功回调
object.success = function(stream){
// 返回值为已订阅流对象
}
* (可选)showVoice 音量值回调
object.showVoice = function(value){
// value值范围(0-100)
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.trySubscribeStream({
tryStream: stream,
success: function(stream){
console.log('订阅流成功', stream.id());
},
showVoice: function(value){
// value值范围(0-100)
},
fail: function(str){
console.log(str);
}
});
1.2.2 取消订阅远程流
rtc.unSubscribeStream(object);
参数说明:
参数名称 | 参数类型 | 说明 | 是否必须 |
---|---|---|---|
unSubStream | object | 要取消订阅的流对象 | 必选 |
success | function | 成功回调(含参数) | 可选 |
fail | function | 失败回调(含参数) | 可选 |
object:对象,包含以下属性
* (必选)unSubStream 要取消订阅的流对象
* (可选)success 成功回调
object.success = function(stream){
// 返回值为已取消订阅流对象
}
* (可选)fail 失败回调
object.fail = function(str){
// 返回值为失败原因,字符串类型
console.log(str);
}
使用例子:
rtc.unSubscribeStream({
unSubStream: stream,
success: function(stream){
console.log('取消订阅流成功', stream.id());
},
fail: function(str){
console.log(str);
}
});
1.2.3 暂停订阅视频
``` rtc.unSubVideo(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| stream | obj | 已订阅远程流 |必选|
| success | function | 成功回调 |可选|
| fail | function | 失败回调 |可选|
object:为对象,包含以下属性
(必选)stream 已订阅远程流
(可选)success 成功回调 object.success = function(){
}
- (可选)fail 失败回调 object.fail = function(str){ // 返回值为失败原因,字符串类型 console.log(str); }
使用例子:
rtc.unSubVideo({ stream: stream, success: function(){
},
fail: function(str){
console.log(str);
}
});
### 1.2.4 恢复订阅视频
rtc.reSubVideo(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| stream | obj | 已订阅远程流 |必选|
| success | function | 成功回调 |可选|
| fail | function | 失败回调 |可选|
object:为对象,包含以下属性
(必选)stream 已订阅远程流
(可选)success 成功回调 object.success = function(){
}
- (可选)fail 失败回调 object.fail = function(str){ // 返回值为失败原因,字符串类型 console.log(str); }
使用例子:
rtc.reSubVideo({ stream: stream, success: function(){
},
fail: function(str){
console.log(str);
}
});
### 1.2.5 暂停订阅音频
rtc.unSubAudio(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| stream | obj | 已订阅远程流 |必选|
| success | function | 成功回调 |可选|
| fail | function | 失败回调 |可选|
object:为对象,包含以下属性
(必选)stream 已订阅远程流
(可选)success 成功回调 object.success = function(){
}
- (可选)fail 失败回调 object.fail = function(str){ // 返回值为失败原因,字符串类型 console.log(str); }
使用例子:
rtc.unSubAudio({ stream: stream, success: function(){
},
fail: function(str){
console.log(str);
}
});
### 1.2.6 恢复订阅音频
rtc.reSubAudio(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| stream | obj | 已订阅远程流 |必选|
| success | function | 成功回调 |可选|
| fail | function | 失败回调 |可选|
object:为对象,包含以下属性
(必选)stream 已订阅远程流
(可选)success 成功回调 object.success = function(){
}
- (可选)fail 失败回调 object.fail = function(str){ // 返回值为失败原因,字符串类型 console.log(str); }
使用例子:
rtc.reSubAudio({ stream: stream, success: function(){
},
fail: function(str){
console.log(str);
}
});
## 1.3 监听流相关事件
事件监听,建议在初始化sdk后做监听
### 1.3.1 新增订阅流事件
将房间内推出的流订阅到本地显示
rtc.on('allow_sub', function (stream) {
// stream 参数说明见下表
// 订阅流
if(stream.isMixed()){
console.log('是混合流,不订阅');
}else{
// 订阅流
rtc.trySubscribeStream({
tryStream: stream,
success:function(stream){
// 订阅流成功
var streamId = stream.id(); // 获取流id
console.log('订阅流成功', streamId);
// 例:
// 将视频动态插入盒子中
var boxHtml = <div class="video-box" id="test${stream.id()}"></div>
document.body.appendChild(boxHtml)
stream.show('test' + streamId, 'contain'); // 将流显示到id为streamId的盒子中
},
fail: function(err){
console.log(err);
}
});
}
});
| 函数名 | 返回值 | 说明 |
| --- | --- | --- |
| stream.attr('role') | 该条流角色 | |
| stream.attr('name') | 该条流姓名 | |
| stream.attr('userid') | 该条流用户ID | |
| stream.id() | 流id(sdk提供的流id) | |
| stream.streamType() | 流类型(详见【1.1.12】)| |
| stream.show(流id, 显示类型(cover/contain) ) | | 显示订阅到的流 |
| stream.isMixed() | 混合流 | 将房间内所有人的视频流混到一起 |
### 1.3.2 监听需要取消订阅流事件
取消订阅已经移除房间的流
rtc.on('unSub', function(stream){ rtc.unSubscribeStream({ unSubStream: stream, success:function(id){ console.log('取消订阅成功', id); }, fail: function(err){ console.log('取消订阅失败', err); } }); });
### 1.3.3 监听通知移除流事件
房间内有流移除会收到此通知
rtc.on('stream_removed', function (stream) { // 删除显示该流用的界面dom $('#'+ stream.id()).remove(); });
### 1.3.4 自己被踢出房间事件(单独广播)
rtc.on('kick_out', function () { // 只有被踢出的人可以收到广播 });
### 1.3.5 直播未开始,不能推流
rtc.on('not_live', function () {});
### 1.3.6 推流前查询直播状态失败,导致没有推流
rtc.on('local_stream_publish_failed', function () {});
## 1.4 部分高级功能
### 1.4.1 获取单条流状态
此方法用于获取已经订阅到或已经推出去的流对象的音视频状态
rtc.getConnectionStats(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| stream | Object | 已经订阅到或已经推出去的流对象|必选|
| success | function | 成功回调(含参数) |可选|
| fail | function | 失败回调(含参数) |可选|
object:包含以下属性
(必选)regionObj 设置混流参数 object.stream = stream;
(可选)success 成功回调 object.success = function(data){ // data 包含音视频详细参数 }
(可选)fail 失败回调 object.fail = function(str){ // 返回值为失败原因,字符串类型 console.log(str); }
使用例子:
rtc.getConnectionStats({ stream: stream, success: function(data){ console.log(data); }, fail: function(str){ console.log(str); } });
[//]: # "### 1.4.2 插播音视频推流"
[//]: # "需要讲师和互动者音视频画面同步,可以开启此功能"
[//]: # "#### 1.4.2.1 推送插播音视频流"
[//]: # "```"
[//]: # "// 需要推流的video/audio标签容器"
[//]: # "let localMedia = document.getElementById('video/audio')"
[//]: # "// 视频/音频已准备好开始播放"
[//]: # "localMedia.addEventListener('canplay', function(){"
[//]: # " rtc.publishInsetStream({"
[//]: # " localMedia: localMedia, // 推流的容器"
[//]: # " type: 'video', // 视频: video, 音频: audio 需要推流的音视频类型"
[//]: # " success: function(stream){"
[//]: # " console.log('推送插播视频/音频成功', stream)"
[//]: # " },"
[//]: # " fail: function(err){"
[//]: # " console.log('推送插播视频/音频失败', err)"
[//]: # " }"
[//]: # " })"
[//]: # "})"
[//]: # "```"
[//]: # "#### 1.4.2.2 监听插播音视频流"
[//]: # "```"
[//]: # "rtc.on('allow_sub', function (stream) {"
[//]: # " // 在这里渲染监听到的插播音视频流"
[//]: # " // stream.streamType() === 2 视频流"
[//]: # " // stream.streamType() === 3 音频流"
[//]: # "})"
[//]: # "```"
[//]: # "#### 1.4.2.3 关闭插播音视频流"
[//]: # "```"
[//]: # "rtc.unPubInsetStream()"
[//]: # "```"
# 2. 直播间操作API
## 2.1 主动调用方法
### 2.1.1 开启直播
直播开启接口由老师角色去控制
rtc.startLive(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| success | function | 成功回调(含参数) |可选|
| fail | function | 失败回调(含参数) |可选|
| callbackData | string | 开启直播自定义参数(最大500字符) |可选|
object:包含以下属性
(可选)success 成功回调 object.success = function(data){ // 返回值对象,包含直播id }
(可选)fail 失败回调 object.fail = function(str){ // 返回值为失败原因,字符串类型 console.log(str); }
使用例子:
rtc.startLive({ success: function(data){ console.log('开启直播成功', data); }, fail: function(str){ console.log(str); } });
### 2.1.2 关闭直播
直播关闭接口由老师角色去控制
rtc.stopLive(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| success | function | 成功回调 |可选|
| fail | function | 失败回调(含参数) |可选|
| callbackData | string | 结束直播自定义参数(最大500字符) |可选|
object:包含以下属性
- (可选)success 成功回调 object.success = function(){
}
- (可选)fail 失败回调 object.fail = function(str){ // 返回值为失败原因,字符串类型 console.log(str); }
使用例子:
rtc.stopLive({ success: function(){ console.log('关闭直播成功'); }, fail: function(str){ console.log(str); } });
### 2.1.3 查询直播是否开启
rtc.getLiveStat(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| success | function | 成功回调(含参数) |可选|
| fail | function | 失败回调(含参数) |可选|
object:包含以下属性
(可选)success 成功回调 object.success = function(data){ // data包含直播id }
(可选)fail 失败回调 object.fail = function(str){ // 返回值为字符串类型 console.log(str); }
使用例子:
rtc.getLiveStat({ success: function(data){ console.log('直播开启状态'); }, fail: function(str){ console.log('直播关闭状态或查询直播失败', str); } });
### 2.1.4 获取设备列表
用于获取当前浏览器可用音视频设备
rtc.getDevice(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| success | function | 成功回调(含参数) |可选|
| fail | function | 失败回调(含参数) |可选|
object:包含以下属性
(可选)success 成功回调 object.success = function(data){ // 返回可用设备列表 }
(可选)fail 失败回调 object.fail = function(str){ // 返回值为字符串类型 console.log(str); }
使用例子:
rtc.getDevice({ success: function(data){ console.log('获取成功', data); }, fail: function(str){ console.log('直播关闭状态或查询直播失败', str); } });
### 2.1.5 获取历史记录
用于获取当前直播中房间的文档翻页,画笔,聊天的历史记录
rtc.getHistory(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| success | function | 成功回调(含参数) |可选|
| fail | function | 失败回调(含参数) |可选|
object:包含以下属性
(可选)success 成功回调 object.success = function(data){ // 返回数据 }
(可选)fail 失败回调 object.fail = function(str){ // 返回值为字符串类型 console.log(str); }
使用例子:
rtc.getHistory({ success: function(data){ console.log('获取成功', data); }, fail: function(str){ console.log(str); } });
### 2.1.6 网络节点选择
#### 2.1.6.1 查询节点
rtc.getNetPoint(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| timeOut | number | 回调事件设置(默认3s) |可选|
| success | function | 成功回调(含参数) |可选|
| fail | function | 失败回调(含参数) |可选|
object:包含以下属性
- (可选)success 成功回调 object.success = function(data){ // 返回可用节点 }
// data数据如下: [{ area_code:"DNYX", // 地区码缩写 is_abroad:1, // 是否属于国外 loc:"新加坡", // 地区名 delay: 63 // 延时,(设置回调时间过短可能没有此字段)
} ... ]
- (可选)fail 失败回调 object.fail = function(data){ // 返回错误数据 console.log(data); }
使用例子:
rtc.getNetPoint({ success: function(data){ console.log('获取成功', data); } });
#### 2.1.6.2 推拉流使用节点
初始化sdk时传入地区码
new Rtc({ userid: 'xxxxxxxx', sessionid: 'xxxxxxxx', areaCode: 'HB' // 使用节点 });
### 2.1.7 开启、结束、暂停、恢复录制
用于控制直播过程中开启、关闭、暂停、恢复录制
rtc.liveRecord(object);
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| status | str | 'start' 开启, 'end' 结束, 'pause' 暂停, 'resume' 恢复 |必选|
| success | function | 成功回调(含参数) |可选|
| fail | function | 失败回调(含参数) |可选|
object:包含以下属性
(必须) status 表示执行动作
(可选)success 成功回调 object.success = function(data){ // 返回数据 }
(可选)fail 失败回调 object.fail = function(str){ // 返回值为字符串类型 console.log(str); }
使用例子:
rtc.liveRecord({ status:'start', success: function(data){ console.log('成功', data); }, fail: function(str){ console.log(str); } });
### 2.1.8 人员列表自定义字段更新
此方法用于在用户列表中更新用户自定义字段
参数说明:
|参数名称 | 参数类型 | 说明 | 是否必须 |
| --- | --- | --- | --- |
| status | string | 最大支持32位 |必选|
| userid | string | 用户id |可选(不填默认为自己|
| success | function | 更新成功回调(含参数) |可选|
| fail | function | 更新失败回调(含参数) |可选|
rtc.updateCustomStatus({ status: '3', success: function(data){ console.log('成功', data); }, fail: function(str){ console.log(str); } });
被动监听人员有自定义状态变化
rtc.on('custom_status_updated', function(data){ console.log('状态已经修改', data); });
//data数据如下
{userid: custormId,custom: status}
## 2.2 被动监听事件
事件监听,建议在初始化sdk后做监听
### 2.2.1 通知开启直播事件
当老师角色调用开启直播接口后,房间内所有人都会监听到该事件
rtc.on('publish_stream' function(str){ console.log('直播已开启'); });
### 2.2.2 通知结束直播事件
当老师角色调用关闭直播接口后,房间内所有人都会监听到该事件
rtc.on('end_stream' function(str){ console.log('直播已关闭'); });
### 2.2.3 通人员列表变更事件
当有人员上下麦或人员进出房间时会收到该事件
rtc.on('online_users' function(data){ console.log(data); });
### 2.2.4 用户加入房间通知其他人员事件
rtc.on("join_room_user", function(data){ console.log(data); });
// data 数据格式如下 {id: 'xxxxxx',name: 'xxxxx'}
### 2.2.5 用户退出房间通知其他人员事件
rtc.on("exit_room_user", function(data){ console.log(data); });
// data 数据格式如下 {id: 'xxxxxx',name: 'xxxxx'}
### 2.2.6 自定义消息发送、接收事件
// 发送自定义消息,data 可自定义 rtc.sendPublishMessage(data);
// 接收自定义消息 rtc.on('publish_message', function(data){ console.log(data); });
// 此方法发送的数据如需保存记录,需联系我们,告知需要记录的数据格式
### 2.2.7 单条流状态通知事件
推流或订阅流每条流每2s会向外抛一条数据
rtc.on('streamStatus' function(data){
console.log(data);
{
stream:stream, //流对象
type: 1 , // 推流0 订阅流1
status: 1001, // 1001正常 1002(检测到疑似黑流状态) /1003异常(流状态异常发送或接收端可能是黑流)
delay: 30, // 延时 推流端延时为0,订阅流能获取到延时状态
bandWidth: 300, //带宽
action: 'streamStatus'
}
}); 使用说明: 1.当首次收到订阅到某条流的流状态为1003,可以尝试取消订阅后,重新订阅,也可以尝试暂停订阅视频 2.当首次收到推送的流状态为1003,可能是本地收集流异常,关闭本地流后,重新创建流推送
### 2.2.8 网络整体状态事件
//如果有推流或者订阅流行为,netStatus事件每 2s会被监听到,此数据是根据订阅流和推流数据,评估出来的
rtc.on('netStatus' function(data){ // 包含流对象、丢包、延时、带宽 console.log(data); { delay: 30, // 延时 如果仅有推流,数据为0 packetLost: 0.01, // 丢包比率 netStatus: 180, // 网络状态参数 (估计值) action: 'netStatus' } }); 使用说明: 可以根据 netStatus 判断整体网络情况 目前评估网络参考值: 0 - 200 较好 200- 500 好 500- 1000 一般
1000 差 ```
2.2.9 推流异常断开事件
由于网络波动,可能会造成推流异常中断,通过此事件可以捕获到流异常断开提醒
rtc.on('publishStreamErr', function(data){
console.log('推流意外终止:'+ data.streamName);
// 直播开启状态下,尝试重推这条流
});
data数据如下streamName 为本地流名称'main'、'picture'
{
streamName: obj.streamName
}
2.2.10 通信服务状态事件
标示通信服务连接状态(可依据此状态在页面做网络可用性提醒),可以根据通信服务状态事件在应用层维护一个单独的通信服务状态码。
// 连接成功(通信服务后连接成功后会收到该回调)
rtc.on('connect_user',function(){
// 更改应用层维护的通信状态码
})
// 断开连接(通信服务断连会收到该回调。)
rtc.on('disconnect_user',function(){
// 页面可不做提示,只更改应用层维护的通信状态码。
})
// 正在重连(通信服务断连后重连时会收到该回调)
rtc.on('reconnecting_user',function(){
// 可提示用户网络中断,正在重连中
})
// 重连成功(通信服务断连后重连成功会收到该回调)
rtc.on("reconnect_user", function() {
// 可提示用户重连成功
})
// 通信服务重连失败后会收到该回调
rtc.on('server_disconnected', function (data) {
// 建议引导用户手动刷新页面
// 1. data 等于 refresh 为通信服务重连失败
// 2. data 等于 undefined 则为流媒体服务断开
});
2.2.11 流服务状态监听事件
// 桌面共享流状态回调,只需要桌面共享发起端监听
rtc.on('screenConnectionStatus', function(data){
console.log(data);
});
// data格式如下{status: 1, type:'screenConnectionStatus'}
status: 1 在开启桌面共享后或异常断开后重连成功后收到
status: 0 连接异常断开后回调
// 流服务状态回调,所有连接端都可监听
rtc.on('connectionStatus', function(data){
console.log(data);
});
// data格式如下{status: 1, type:'connectionStatus'}
status: 1 在开启直播后连接成功或异常断开重连成功后回调
status: 0 连接异常断开后回调
2.2.12 流渲染自动播放失败回调事件
当有视频不能自动播放时会收到以下回调
rtc.on('playError', function(data){
console.log(data);
});
// data格式如下:
{videoDom: ‘XXX’}
处理建议:
1.将收到的回调中videoDom依次加入数组
2.通过dom交互后,遍历数组中每一项,使用videoDom.play()的方法播放每一个video
3. 版本发布说明
websdk_4.0.js 线上使用地址
<script src="https://class.csslcloud.net/static/dist/js/websdk_4.0.js" type="text/javascript">
3.1 部分接口返回数据有改动
3.1.1 判断流类型
// 是否是混合流 返回值 true/false
stream.isMixed()
// 是否是桌面共享流 返回值详见 1.1.11
stream.streamType()
// 是否有视频 返回值 true/false
stream.hasVideo()
// 是否有音频 返回值 true/false
stream.hasAudio()
3.1.2 创建本地流变动
分辨率只支持640 480 和320 240两种 客户如果指定deviceId,需确保所传deviceId一定存在,如果不存在,创建流会失败
3.1.3 合流处理
推送本地流和桌面共享流时,新增 mix 参数,标示是否把当前流合进合流, 默认 false 不合, true 合入合流
4. 热切
热切的探测触发仅支持讲师角色(presenter)
4.0.1 自动热切消息确认监听
switch_platform_intent,该消息定向下发给讲师(presenter)和助教(assistant)。
监听到热切确认消息后,可以在UI层展示一个弹层交互,由讲师(presenter)选择执行热切消息确认(同意 / 取消);
也可以在监听到热切确认消息后,直接静默执行热切消息确认(同意)。
rtc.on('switch_platform_intent', function(data){
// 热切消息确认 - 同意
switchPlatform.eventSwitch({ id: data.id, action: 'confirm'})
// 热切消息确认 - 取消
switchPlatform.eventSwitch({id: data.id,action: 'cancel'})
})
// data 数据结构
{
"id": "sp-1000000000",
"time": "2020-01-20 15:03:34",
}
4.0.2 是否执行热切
switchPlatform.eventSwitch(obj) // switchPlatform.eventSwitch() 方法内部做了仅讲师角色(presenter)可执行限制
switchPlatform.eventSwitch() 参数说明:
Key | Type | Value |
---|---|---|
id | String (必传) | 取自rtc.on('switch_platform_intent',fn(res))的返回值; |
action | String (必传) | confirm 为同意热切;cancel为取消热切; |
4.0.3 热切监听 - 讲师
switch_platform,该消息定向下发给讲师(presenter)和助教(assistant)。
rtc.on('switch_platform', function(){
switchPlatform.onTeacherSwitchPlatform(); // 因该版本热切功能仅支持讲师角色(presenter),故switchPlatform.onTeacherSwitchPlatform()方法内部做了仅讲师角色可行限制
})
4.0.4 热切监听 - 互动者
switch_platform_to_talker,该消息在整个房间内全员下发。
rtc.on('switch_platform_to_talker', function(){
switchPlatform.onStudentSwitchPlatform() // switchPlatform.onStudentSwitchPlatform() 方法内部做了仅学员角色可执行限制
})
更新日志
更新日期 | 功能 |
---|---|
2020/11/20 | 新增网络异常情况处理( 0.2.3 流服务断开回调和重连方法 2.2.9 监听推流异常断开 2.2.10 通信服务状态监听。 ) |